package com.sztx.pay.center.core.service;

import java.util.List;

import com.sztx.pay.center.common.util.Constance.ActLevel;
import com.sztx.pay.center.common.util.Constance.BindCardType;
import com.sztx.pay.center.core.service.bean.BindInfo;
import com.sztx.pay.center.core.service.bean.rpc.QueryMerBindCardRequest;
import com.sztx.pay.center.core.service.bean.rpc.ResponsePageModel;
import com.sztx.pay.center.core.service.bean.rpc.UserActInfoResponse;
import com.sztx.pay.center.core.service.bean.rpc.UserInfoRequest;
import com.sztx.pay.center.core.service.bean.rpc.UserInfoResponse;
import com.sztx.pay.center.dataaccess.domain.UserActAmountDO;
import com.sztx.pay.center.dataaccess.domain.UserActDO;
import com.sztx.pay.center.dataaccess.domain.UserBindCardDO;
import com.sztx.se.core.service.BaseService;
import com.sztx.usercenter.rpc.api.domain.out.UserStatusInfoVO;


public interface AccountService  extends BaseService{
	
	/**
	 * 创建账户
	 * 
	 * @param userId
	 * @param userType
	 * @param actType
	 * @param mobileNo
	 * @param attach
	 * @return
	 * @author xiaosc
	 * @date 2016年2月16日 下午2:49:44 
	 * @see [类、类#方法、类#成员]
	 */
	String createAct(String userId, Integer userType, Integer actType, String mobileNo, String attach);
	
	boolean freezedBalance(String userId, Integer actType, String operator, String attach);
	
	boolean unfreezeBalance(String userId, Integer actType, String operator, String attach);
	
	boolean freezeMoney(String userId, Integer actType, long amount, String operator, String attach);
	
	boolean unfreezeMoney(String userId, Integer actType, long amount, String operator, String attach);
	
	/**
	 * 将用户在通付的余额同步到通行系统
	 * @param userId
	 * @return
	 */
	boolean syncUserBalance(String userId);
	
	/**
	 * 实名用户在通付的账户信息
	 * @param userId       用户berbon账号
	 * @param realName     用户真实姓名
	 * @param identityNo   用户身份证号
	 * @param mobileNo     用户手机号
	 * @return
	 */
	boolean realNameTfAct(String userId, String realName, String identityNo, String mobileNo);
	
	
	/**
	 * 改变用户的灰度状态
	 * @param userId
	 * @return
	 */
	boolean changeGrayState(String userId, Integer newGraySate);
	
	/**
	 * 同步用户在通付的卡信息
	 * @param userId
	 * @return
	 */
	boolean syncBindCard(String userId);
	

	/**
	 * 查询用户余额
	 * 
	 * @param userId
	 * @param actType
	 * @return
	 * @author xiaosc
	 * @date 2016年2月16日 下午2:50:57 
	 * @see [类、类#方法、类#成员]
	 */
	long queryBalance(String userId, Integer actType,boolean isCheckActStatus);
	
	UserActDO queryAllBalance(String userId, Integer actType,boolean isCheckActStatus);
	
	String findRealActNo(String userId, Integer actType);
	
	UserActDO findRealActInfo(String userId, Integer actType);
	
	boolean openMerchant(String userId, Integer userType, String attach);
	
	String bindCard(String userId, BindInfo bindInfo,String gateWayChannelId,String routeNo, String clientSourceType);
	
	/**
	 * 快捷支付绑卡验证码校验
	 * 
	 * @param bindNo
	 * @param verifyCode
	 * @return
	 * @author xiaosc
	 * @date 2016年2月25日 下午8:30:19 
	 */
	boolean verifyBindCard(String bindNo, String verifyCode);
	
	/**
	 * 重新发送绑卡验证码
	 * 
	 * @param bindNo
	 */
	boolean resendVerifyCode(String bindNo);
	
	UserBindCardDO findUserBindInfo(String bindNo, String userId, BindCardType bindCardType);
	
	/**
	 * 用户账户迁移
	 * <功能详细描述>
	 * @param userId           用户berbon账号     Y 
	 * @param isRealName       用户是否已实名认证   Y
	 * @param mobileNo         用户手机号		N
	 * @param realName         用户真实姓名		N
	 * @param identityNo       用户身份证号		N
	 * @return
	 * @author xiaosc
	 */

	String transferUser(String userId, Integer userType, boolean isRealName, String mobileNo, String realName, String identityNo,String lastOperator,String remark);
	


	String grayUser(String userId, String operator, String remark);
	
	
	boolean isGrayUser(String userId);
	
	/**
	 * 账户实名认证
	 * <功能详细描述>
	 * @param userId
	 * @param actLevel
	 * @param realName
	 * @param identityNo
	 * @param mobileNo
	 * @author xiaosc
	 * @date 2016年2月16日 下午5:16:10 
	 * @see [类、类#方法、类#成员]
	 */
	boolean realAuth(String userId, ActLevel actLevel, String realName, String identityNo, String mobileNo);
	
	
	boolean unbindCard(String userId, String bindNo);
	
	boolean setPrimaryCard(String userId, String bindNo);
	
	List<UserBindCardDO> queryBindCardList(String userId, int bindType);
	
//	setPrimaryCard(String userId, String bindNo);
//	
//	queryBindCardList(String userId, int bindType);
	
	boolean changeUserType(String userId, Integer userType, String attach);
	
	UserBindCardDO findUserBindInfo(String bindNo);
	
	/**
	 * 获取用户最近绑定的存储卡
	 * @param userId
	 * @return
	 */
	UserBindCardDO findLastBindCardInfo(String userId);
	/**
	 *  获取用户最近提现银行卡
	 * @param userId
	 * @return
	 */
	UserBindCardDO findLastWithdrawCardInfo(String userId);
	/**
	 *  获取用户最近充值银行卡
	 * @param userId
	 * @return
	 */
	UserBindCardDO findLastChargeCardInfo(String userId);
	/**
	 *  获取用户最近支付方式
	 * @param userId
	 * @return
	 */
	Integer findLastChannelId(String userId);
	/**
	 * 查询商户信息
	 * @param partner
	 * @param actType
	 * @return
	 */
	UserActInfoResponse queryMchAct(String partner,String actType);
	/**
	 * 查询用户信息
	 * @param userId
	 * @param actType
	 * @return
	 */
	UserActInfoResponse queryUserAct(String actNo,String actType,String userId);
	/**
	 * 查询用户基础信息
	 * @param userId
	 * @return
	 */
	UserStatusInfoVO queryUserStatusInfo(String userId);/**
	 * 修改企业银行卡信息
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	ResponsePageModel<UserBindCardDO> queryMchCardList(QueryMerBindCardRequest request);
	/**
	 * 更新企业银行卡信息
	 * @param userId
	 * @param bindCardNo
	 * @param bindInfo
	 * @return
	 */
	void updateMchBindInfo(String userId,String bindCardNo, BindInfo bindInfo);	/* 查询用户列表
	 * @param userType
	 * @param actType
	 * @param userId
	 * @return
	 */
//	ResponsePageModel<UserActInfoResponse> queryUserActList(Integer userType,int actType,String userId,PageQuery pageQuery);
	/**
	 * 修改用户信息（备注+状态）
	 * @param userId
	 * @param remark
	 * @param actState
	 * @param lastOperator
	 */
//	void modifyUserAct(String userId,String remark,int actState,String lastOperator,int actType);
	
	List<UserInfoResponse> queryUserActList(UserInfoRequest request,int pageNo,int pageSize); 
	
	Integer queryUserActCount(UserInfoRequest request); 
	/**
	 * 查询用户绑卡信息(不关心卡状态)
	 * @param bindNo
	 * @param userId
	 * @param bindCardType
	 * @return
	 */
	UserBindCardDO findUserBindInfoIgnoreState(String bindNo, String userId, BindCardType bindCardType);

	/**
	 * 查询用户汇总余额
	 * @param excludeUsers
	 * @return
	 */
	List<UserActAmountDO> queryUserAmountCollect(List<String> includeUsers);
	/**
	 * 查询汇总用户总数
	 * @param excludeUsers
	 * @return
	 */
	int queryCollectAmountUserCount(List<String> includeUsers);
}
